package com.sushi.utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import javax.imageio.ImageIO;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

/**
 * 文件工具类
 * @author Administrator
 */
@Slf4j
public class ImageUtil {

    public static final String JPG = "jpg";

    public static final String PNG = "png";


    /**
     * 从pdf文件获取图片 仅第一页预览
     * 保存到默认路径，默认jpg，默认时间命名
     * @param file 文件，对接下载文件的接口返回值
     */
    public static void getImageFromPdfFirst(File file) {
        getImageFromPdfFirst(file, String.valueOf(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()));
    }

    /**
     * 从pdf文件获取图片 仅第一页预览
     * 保存到默认路径，默认jpg
     * @param file 文件，对接下载文件的接口返回值
     * @param pictureName 图片命名
     */
    public static void getImageFromPdfFirst(File file, String pictureName) {
        getImageFromPdfFirst(file, FileUtil.DEFAULT_TEMP_FILE_DIR, JPG, pictureName);
    }

    /**
     * 从pdf文件获取图片 仅第一页预览
     * @param file 文件，对接下载文件的接口返回值
     * @param localDir 图片保存目录
     * @param imageType 图片格式
     * @param pictureName 图片命名
     */
    public static void getImageFromPdfFirst(File file, String localDir, String imageType, String pictureName) {
        getImageFromPdf(file, localDir, imageType, pictureName, 0, 1);
    }

    /**
     * 从pdf文件获取图片 所有
     * 存到默认路径，默认jpg，默认时间命名
     * @param file 文件，对接下载文件的接口返回值
     */
    public static void getImageFromPdfAll(File file) {
        getImageFromPdfAll(file, String.valueOf(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()));
    }

    /**
     * 从pdf文件获取图片 所有
     * 存到默认路径，默认jpg
     * @param file 文件，对接下载文件的接口返回值
     * @param pictureName 图片命名
     */
    public static void getImageFromPdfAll(File file, String pictureName) {
        getImageFromPdfAll(file, FileUtil.DEFAULT_TEMP_FILE_DIR, JPG, pictureName);
    }

    /**
     * 从pdf文件获取图片 所有
     * @param file 文件，对接下载文件的接口返回值
     * @param localDir 图片保存目录
     * @param imageType 图片格式
     * @param pictureName 图片命名
     */
    public static void getImageFromPdfAll(File file, String localDir, String imageType, String pictureName) {
        getImageFromPdf(file, localDir, imageType, pictureName, 0, Integer.MAX_VALUE);
    }

    /**
     * 从pdf文件获取图片 自定义页数
     * @param file 文件，对接下载文件的接口返回值
     * @param localDir 图片保存目录
     * @param imageType 图片格式
     * @param pictureName 图片命名
     * @param startPage 开始页数(包含) 从0开始
     * @param endPage 结束页数(不包含)
     */
    public static void getImageFromPdf(File file, String localDir, String imageType, String pictureName, Integer startPage, Integer endPage) {
        if (null == file || !file.exists()) {
            log.info("文件不存在，无法生成图片");
            return;
        }
        try {
            PDDocument document = PDDocument.load(file);
            PDFRenderer pdf = new PDFRenderer(document);
            if (null != document) {
                int pageTotal = document.getNumberOfPages();
                if (pageTotal > 0) {
                    boolean singlePageFlag = pageTotal == 1;
                    for (int i = startPage; i < Math.min(endPage, pageTotal); i++) {
                        BufferedImage image = pdf.renderImageWithDPI(i, 144);
                        String fileName = localDir + pictureName;
                        if (!singlePageFlag) {
                            fileName += i;
                        }
                        fileName += StringUtil.DIR_POINT + imageType;
                        File picture = new File(fileName);
                        ImageIO.write(image, imageType, picture);
                        log.info("图片生成成功，路径为：{}", picture.getAbsolutePath());
                    }
                }
                document.close();
            }
        }catch (IOException e) {
            log.info("生成图片异常");
            e.printStackTrace();
        }

    }

}
